package com.geek.factory_config.functional;

import lombok.Builder;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;

/**
 * 工厂创建某个类，可以做成通用的,例如DI容器，但是项目中的类工厂，
 * 一般是针对某一种类的创建，所以可以将一部分通用的创建流程放在工厂类中，
 * 如果像下面这种方式，工厂类的职责比较少，创建的逻辑就要放到实现类中了，
 * 这样子显得没有太大必要
 * @param <T>
 */
public class GeneralFactory<T> {
    private Map<String, T> cacheBean = new ConcurrentHashMap<>();
    private Function<String, T> configParserFunction;

    @Builder
    public GeneralFactory(Function<String, T> configParserFunction) {
        this.configParserFunction = configParserFunction;
    }

    public T get(String configFormat) {
        return cacheBean.computeIfAbsent(configFormat, s -> configParserFunction.apply(s));
    }
}